昨天的崩潰文比平常文章更多點擊 笑死 我還沒更新..
transaction isolation 部分之後如果讀了更多比較有東西寫的話,會更新在這
推薦做做 SQLBolt 題目提升語法熟悉度
今天把飛飛推薦的 SQLBolt 做完,
好處是每章下面的練習題體驗很不錯(query時會馬上顯示現在sql的結果),
題目偏簡單,但對於學基本 sql syntax 還不錯。
對每天念 MySQL Basics 的 tutorials 感到有點厭倦XD
先跳去看看比較有興趣的,還想多一點 mysql 背後運作細節。
本篇包含 1 section:
10. transaction / locks
10. transactions / locks
覺得這篇教學沒寫得很好@@ 有些東西是自己補充
transaction
ACID
syntax
以 START TRANSACTION
或 BEGIN
或 BEGIN WORK
開頭
COMMIT
ROLLBACK
這邊好像需要多點例子比較好
SET autocommit = 0;
預設為1
4 個隔離級別(isolation level)
再補充
由寬鬆 -> 嚴格:
- read uncommitted
可以讀其他 transaction 還沒 commit 的資料,如果 rollback 的話,就等於讀到了被取消的資料(dirty read)
- read committed
兩次 select 之間若有其他 transaction commit,會導致讀到不同資料。(phantom read)
- repeatable read(innodb 預設)
一個 transaction 內,除非自己修改不然 select 結果會一樣
- serializable
多個 transaction 進行時,read 可能發生的現象(問題)
再補充
- phantom read
- dirty read
- non-repeatable read
table locking
一個 sql server 可以有很多 client session 連,lock 某張表 可以避免一些同時間操作導致的衝突
- session 突然中止,MySQL 會把他的所有 lock 解除
-
SHOW PROCESSLIST;
確認狀態,例如是否在 waiting
syntax
LOCK TABLES table_name1 [READ | WRITE],
table_name2 [READ | WRITE],
... ;
UNLOCK TABLES
read lock(shared lock)
- 有 read lock 的 session 只能讀不能寫
- 同時可以有多個 session 對同張表有 read lock,而且沒有 read lock 也是可以讀取資料
- 某張表有 read lock 時,其他 session 不能寫
write lock(exclusive lock)
- 有 write lock 的 session 可讀可寫
- 同時只能一個 session 有 write lock
- 其他 sessions 不能讀寫有 write lock 的表